#ifndef __LIST_H__
#define __LIST_H__
#include "cppcore.h"


template <typename T> class Node;

template <typename T>
class List {
public:
    Node<T> *head, *tail;
    int counter;
    static FILE* file;

    // 构造函数, 头指针申请空间, 尾指向头.
    List();
    // 析构函数, 先清空链表, 再删除头指针.
    ~List();

    // 从文件中读取数据, 恢复链表.
    void create();
    // 将链表保存到文件.
    void save();
    // 读文件.
    void readFile();
    // 遍历结点, 写文件.
    void writeFile();

    // 遍历输出整个链表的数据.
    void print();
    // 遍历删除结点, 清空链表.
    void clear();
    // 连续从键盘输入数据, 加到链表尾部.
    void scan();
    /**
     * @brief 使用回调在遍历时完成指定操作.
     * @param callback 回调, 完成对结点的操作.
     * @param moveTo   回调, 使链表指针移动到下一个目标.
     */
    void traverse(
        void     (*callback)(Node<T>* that),
        Node<T>* (*moveTo)(Node<T>* that));
    /**
     * @brief 搜索符合条件的结点.
     * @return 一个可变数组 (vector), 内有符合条件结点的指针.
     */
    std::vector<Node<T>*>* search(std::wstring& str);

    /**
     * @brief 输入搜索内容.
     * @return 刚才输入的内容.
     */
    std::wstring scanCommand();

    /**
     * @brief 解析输入的内容为搜索指令, 该函数模板可以使用的特化版本
     只有 Student, Course, StuCrs 三种.
     * @param wstr  [IN/OUT] 搜索内容.
     * @param wstrs [OUT] 字符串池, 搜索字符串数据需要使用.
     * @param code  [OUT] 搜索指令.
     */
    void parse(
        std::wstring& wstr,
        std::vector<std::wstring>& wstrs,
        std::vector<int>& code);
};


#endif /* __LIST_H__ */
